package br.com.simulador.model;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.MappedSuperclass;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;


@MappedSuperclass
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class BaseEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Version
    @XmlTransient
    private Long version;
    
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataCriacao = new Date();

    /**
     * Retorna o id.
     * 
     * @return Long o id.
     */
    public abstract Long getId();

    /**
     * Retorna a versão do objeto.
     * 
     * @return Long a versão do objeto.
     */
    public Long getVersion() {
	return version;
    }

    /**
     * Atribui uma nova versão ao objeto.
     * 
     * @param version
     *            a versão a ser atribuída.
     */
    public void setVersion(Long version) {
	this.version = version;
    }

    /**
     * método que implementa o hashcode do objeto.
     * 
     * @return int o valor do hashCode do objeto.
     */
    @Override
    public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
	return result;
    }

    /**
     * método que implementa a comparação entre dois objetos.
     * 
     * @param obj
     *            o objeto a ser comparado.
     * @return boolean retorna <b> true</b> se o objeto for igual, e
     *         <b>false</b> caso contrário.
     */
    @Override
    public boolean equals(Object obj) {
	if (this == obj) {
	    return true;
	}
	if (obj == null) {
	    return false;
	}
	if (getClass() != obj.getClass()) {
	    return false;
	}
	BaseEntity other = (BaseEntity) obj;
	if (getId() == null) {
	    if (other.getId() != null) {
		return false;
	    }
	} else if (!getId().equals(other.getId())) {
	    return false;
	}
	return true;
    }

	public Date getDataCriacao() {
		return dataCriacao;
	}

	public void setDataCriacao(Date dataCricao) {
		this.dataCriacao = dataCricao;
	}

}
